// 引入核心内置模块 path
const path = require('path')
// 引入打包模板html插件
const HtmlWebpackPlugin = require('html-webpack-plugin');
// 引入抽离css插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// 引入压缩css插件
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
  // 'development' | 'production
  // 模式
  mode: 'production',
  // 映射
  devtool: 'source-map',
  // 入口
  entry: {
    main: './src/index.js',
    app: './src/app.js'
  },
  // 出口
  output: {
    // 出口路径
    path: path.resolve(__dirname, 'dist'),
    // 使用6位hash配置输出文件名，保证每次有改动构建文件名不重复
    filename: '[name]-[contenthash:6].js',
    // 打包前清空
    clean: true
  },
  // loader
  module: {
    rules: [
      // 处理 less
      {
        test: /\.less$/i,
        use: [
          // compiles Less to CSS
          //抽离css
          MiniCssExtractPlugin.loader,
          'css-loader',
          'less-loader',
        ],
      },
      // 处理 css
      {
        test: /\.css$/i,
        use: [MiniCssExtractPlugin.loader, "css-loader"],
      },
      // 处理 js 
      {
        test: /\.m?js$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      },
      // 处理图片
      {
        test: /\.(png|jpe?g|gif)$/i,
        // 注意： url-loader 依赖 file-loader
        loader: 'url-loader',
        options: {
          // 生成文件夹路径
          outputPath: 'img',
          // 限制
          limit: 1024 * 12,
          // 文件名字
          name: '[name]-[contenthash:4].[ext]'
        },
      },
      // 处理图标
      {
        test: /\.(svg|ttf|woff2?)/,
        loader: 'file-laoder'
      },
      // 处理scss
      {
        test: /\.s[ac]ss$/i,
        use: [
          // 将 JS 字符串生成为 style 节点
          'style-loader',
          // 将 CSS 转化成 CommonJS 模块
          'css-loader',
          // 将 Sass 编译成 CSS
          'sass-loader',
        ],
      },
    ],
  },
  plugins: [
    // 打包模板html
    new HtmlWebpackPlugin({
      // 指定模板文件
      template: './src/index.html'
    }),
    // 抽离
    new MiniCssExtractPlugin()
  ],
  // 测试服务器
  devServer: {
    // 热跟心
    hot: true,
    // 端口
    port: 3030,
    // 自动打开浏览器
    open: true,
    before(app) {
      // 接口
      app.get('/data',(req, res) => {
        res.send({
          code: 200
        })
      })
    }
  },
  // 解析
  resolve: {
    // 别名
    alias: {
      "@": path.resolve(__dirname, 'src'),
    },
    // 后缀名
    extensions: ['.js', '.json'],
  },
  // 优化
  optimization: {
    minimizer: [
      // 在 webpack@5 中，你可以使用 `...` 语法来扩展现有的 minimizer（即 `terser-webpack-plugin`），将下一行取消注释
      // `...`,
      // 压缩 css
      new CssMinimizerPlugin(),
    ],
  },
}